﻿#ifndef _RESOURCE_TOOL_
#define _RESOURCE_TOOL_

//#define WIN32_LEAN_AND_MEAN             // 从 Windows 头文件中排除极少使用的内容
#include <Windows.h>
#include <io.h>
#include <sys/stat.h>
#include <string>
#include <locale>
#include <codecvt>
#include <vector>
#include <filesystem>
#include <iostream>
#include <string>
#include "char_tool.h"
#include <Shlobj.h>
#include <tchar.h>

inline static void replace_last_name(char* in, const char* pattern);

/// <summary>
/// 重写内部文件到临时目录  （记得删除）
/// </summary>
/// <param name="SOURCEID">内部文件ID</param>
/// <param name="pattern">文件后缀名, txt, mp3等</param>
/// <param name="tempname">临时名</param>
/// <returns>临时文件路径</returns>
char* make_resource_temp_path(int SOURCEID, const char* pattern);

char* make_resource_temp_path_correct_name(int SOURCEID, const char* name);

std::wstring make_resource_temp_path_correct_name(int SOURCEID, std::wstring name);

/// <summary>
/// 重写内部文件到指定目录（目录要带文件名）
/// </summary>
/// <param name="SOURCEID">内部文件ID</param>
/// <param name="pattern">文件后缀名, txt, mp3等</param>
/// <param name="tempname">文件去向路径</param>
void make_resource_to_path(int SOURCEID, const char* pattern, const char* to_path);


#if defined(_MSC_VER) && (_MSC_VER >= 1310) /*Visual Studio: A few warning types are not desired here.*/
#pragma warning( disable : 4996 ) /*VS does not like fopen, but fopen_s is not standard C so unusable here*/
#endif /*_MSC_VER */

static unsigned long byteswap_ulong(unsigned long i);

static inline int Abs(int x);

static unsigned short byteswap_ushort(unsigned short i);

//获得图片 宽 高 大小 WITHOUT loading image into memory
bool get_image_size(const char* file_path_utf8, int& width, int& height, int& file_size);

// 获取图片的宽度和高度
bool get_image_size(const unsigned char* imageData, size_t imageSize, int& width, int& height);

// 判断一个文件的后缀名是不是指定后缀名
bool file_ext_is(const char* filename, const char* extname);

/// <summary>
/// 输入/出 都是windows默认GBK编码！！！
/// 从一个文件夹路径读取所有文件 （不递归且自动跳过文件夹）！！！会跳过带有特殊字体的文件
/// </summary>
/// <param name="path"></param>
/// <returns>文件列表（绝对路径）</returns>
std::vector<std::string> get_files_no_dir(const std::string path);

/// <summary>
/// 输入/出 都是windows默认GBK编码！！！
/// 从一个文件夹路径读取所有文件 (递归展开读取) ！！！会跳过带有特殊字体的文件
/// </summary>
/// <param name="path"></param>
/// <returns>文件列表（绝对路径）</returns>
std::vector<std::string> get_files_all(std::string directory);


/// <summary>
/// 输入/出 都是windows默认GBK编码！！！
/// 从一个文件夹路径读取所有文件夹 （不递归且自动跳过文件夹）！！！会跳过带有特殊字体的
/// </summary>
/// <param name="path"></param>
/// <returns>文件夹列表（绝对路径）</returns>
std::vector<std::string> get_dirs_only(const std::string path);

/// <summary>
/// 输入/出 都是windows默认GBK编码！！！
/// 从一个文件夹路径读取所有文件夹路径 (递归展开读取) ！！！会跳过带有特殊字体的文件
/// </summary>
/// <param name="path"></param>
/// <returns>文件夹列表（绝对路径）</returns>
std::vector<std::string> get_dirs_all(const std::string directory);

std::string wstr_to_utf8(const std::wstring& src);

std::wstring utf8_to_wstr(const std::string& src);

bool GetImageFromResource(int resourceId, unsigned char*& imageData, int& imageSize, TCHAR* pattern);

/// <summary>
/// 从 windows 浏览文件夹界面UI获得路径
/// </summary>
/// <returns></returns>
char* input_dir_ui();

// 用于显示文件打开对话框UI并获取文件路径
bool input_file_ui(TCHAR* szFilePath);

// 从文件路径分离出文件名
std::string split_file_name(const std::string& filePath);

// 从一个字符串的 last 之后删除所有（包含 last）
std::string split_str_from_last(const std::string& filePath, const char* last);

// 从文件路径分离出文件路径
std::string split_file_last_path(const std::string& filePath);

// 从文件路径分离出文件不带拓展名的路径
std::string split_file_exc_path(const std::string& filePath);

/// <summary>
/// 读取资源文件到指针数组里
/// dwResId：资源id
/// _p：数组指针
/// type： 文件类型 (txt, jpg...)
/// </summary>
template<typename T>
bool ReadResourceToPoint(DWORD dwResId, T*& _p, TCHAR* type);
//
//std::vector<std::string> get_files_all_u16(std::string s);
//std::vector<std::string> get_files_all_u16(std::u16string directory);
//std::vector<std::string> get_files_no_dir_u16(std::string path);
//
//std::vector<std::string> get_dirs_only_u16(std::string path);
//
//std::vector<std::string> get_dirs_all_u16(std::string s);
//std::vector<std::string> get_dirs_all_u16(std::u16string directory);
#endif // !_RESOURCE_TOOL_
